home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_33 / gusplay.asm < prev   
Assembly Source File  |  1995-01-01  |  38KB  |  2,064 lines

  1.     Comment &
  2.  
  3.     Gus play routine V 0.1b by Robert Adolfsson - CASCADA
  4.     Not for release!
  5.  
  6.     NosieTracker/SoundTracker/StarTrekker compatible
  7.  
  8.     &
  9.  
  10.     Jumps
  11.     .286
  12.  
  13. _Code    Segment Para 'PlaySeg'
  14.  
  15.     assume    cs:_Code
  16.  
  17. ;    Publics
  18.  
  19. Public    MainVolume,PlayingPattern,PatternRow,ChanOn,NumChans
  20. Public    LoadMod,ClearMem,StartPlaying,StopPlaying,Init,InitDevice
  21.  
  22. ;    Structures
  23.  
  24. ChanSize    Equ 50
  25.  
  26. ChanInfo    Struc
  27.  
  28. SampOff        dd 0
  29. FreqVal     dw 0
  30. Vol         dw 0
  31. OldVol        dw 0
  32. Fine         dw 0
  33. Repeat         dw 0
  34. RepLen         dw 0
  35. Len         dw 0
  36. Amiga         dw 0
  37. Effect         dw 0
  38. VibratoPek     dw 0
  39. OldVibrato     dw 0
  40. PortTo         dw 0
  41. OldPortTo     dw 0
  42. EffectTime    dw 0
  43. CurrSamp    dw 0
  44. OldSamp        dw 0
  45. Arp         dw 0,0,0
  46. ArpCounter     dw 0
  47. InstSet        dw 0
  48. LoopOnOff    dw 0
  49. OffsetAdd    dw 0
  50.  
  51. ChanInfo    EndS
  52.  
  53. ; Number of voices to use
  54.  
  55. NumVoices    Equ 20
  56.  
  57. ; UltraSound Ports
  58.  
  59. BasePort    Equ 220h
  60. StatusPort    Equ BasePort+6h
  61. TimerCtrlPort    Equ BasePort+8h
  62. TimerDataPort    Equ BasePort+9h
  63. MidiCtrlPort    Equ BasePort+100h
  64. MidiDataPort    Equ BasePort+101h
  65. ActiveVoicePort    Equ BasePort+102h
  66. CommandPort    Equ BasePort+103h
  67. DataLowPort    Equ BasePort+104h
  68. DataHighPort    Equ BasePort+105h
  69. DRAMIOPort    Equ BasePort+107h
  70.  
  71. ; UltraSound Commands
  72.  
  73. WriteVoiceMode    Equ 00h
  74. SetVoiceFreq    Equ 01h        ; Value=Freq/Divisor
  75. LoopStartLo    Equ 02h
  76. LoopStartHi    Equ 03h
  77. SampleEndLo    Equ 04h
  78. SampleEndHi    Equ 05h
  79. VolRampRate    Equ 06h
  80. VolRampStart    Equ 07h
  81. VolRampEnd    Equ 08h
  82. SetVolume    Equ 09h
  83. SampleStartLo    Equ 0Ah
  84. SampleStartHi    Equ 0Bh
  85. VoiceBalance    Equ 0Ch
  86. VolumeCtrl    Equ 0Dh
  87. VoicesActive    Equ 0Eh
  88. DMACtrl        Equ 41h
  89. DRAMAddrLo    Equ 43h
  90. DRAMAddrHi    Equ 44h
  91. Initialize    Equ 4Ch
  92. ReadVolume    Equ 89h
  93. VoicePosLo    Equ 8Ah
  94. VoicePosHi    Equ 8Bh
  95. ReadVolCtrl    Equ 8Dh
  96.  
  97. ; Divisors
  98.  
  99. Voices14    Equ 43
  100. Voices15    Equ 40
  101. Voices16    Equ 37
  102. Voices17    Equ 35
  103. Voices18    Equ 33
  104. Voices19    Equ 31
  105. Voices20    Equ 30
  106. Voices21    Equ 28
  107. Voices22    Equ 27
  108. Voices23    Equ 26
  109. Voices24    Equ 25
  110. Voices25    Equ 24
  111. Voices26    Equ 23
  112. Voices27    Equ 22
  113. Voices28    Equ 21
  114. Voices29    Equ 20
  115. Voices30    Equ 20
  116. Voices31    Equ 19
  117. Voices32    Equ 18
  118.  
  119. ;    Variables
  120.  
  121. MKSign        db 'M.K.FLT46CHN8CHNOCTA'
  122. MKMod        db 0
  123. Info        db 1084 dup (0)
  124. OrderLen    db 0
  125. Restart        db 0
  126. PatternOrder    db 128 dup (0)
  127. SinTab        db 0,25,50,74,98,120,142,162,180,197,212,225,236
  128.         db 244,250,254,255,254,250,244,236,225,212,197,180
  129.         db 162,142,120,98,74,50,25
  130.  
  131. ArpTable    db 70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70
  132.         db 70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,68,68,68,68,68,68,68,66,66,66,66,66,66,66,64,64,64,64,64,64,64,64,62,62,62,62,62,62,62,62,60,60,60,60,60,60,60,60,58,58,58,58,58,58
  133.         db 58,58,58,56,56,56,56,56,56,56,56,56,56,54,54,54,54,54,54,54,54,54,54,52,52,52,52,52,52,52,52,52,52,50,50,50,50,50,50,50,50,50,50,50,50,48,48,48,48,48,48,48,48,48,48,48,48,46,46,46,46,46,46,46,46,46,46,46,46,44,44,44,44,44,44,44,44,44,44
  134.         db 44,44,44,44,42,42,42,42,42,42,42,42,42,42,42,42,42,42,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,34,34,34,34,34,34,34,34,34,34,34,34,34
  135.         db 34,34,34,34,34,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,26,26,26,26,26,26,26,26,26,26,26,26,26
  136.         db 26,26,26,26,26,26,26,26,26,26,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20
  137.         db 20,20,20,20,20,20,20,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,14,14,14,14,14,14,14,14,14,14,14,14,14,14
  138.         db 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
  139.         db 10,10,10,10,10,10,10,10,10,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  140.         db 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  141.  
  142. PanRegs        db 5,10,10,5,0,0,0,0,0,0,0,0,0,0,0,0
  143.         db 5,5,10,10,10,5,0,0,0,0,0,0,0,0,0,0
  144.         db 5,5,10,10,10,10,5,5,0,0,0,0,0,0,0,0
  145.  
  146. EvenData
  147.  
  148. AmigaVals    dw 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to B-1 Finetune +0.
  149.         dw 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to B-2 Finetune +0.
  150.         dw 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to B-3 Finetune +0.
  151.  
  152.         dw 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to B-1 Finetune +1.
  153.         dw 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to B-2 Finetune +1.
  154.         dw 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to B-3 Finetune +1.
  155.  
  156.         dw 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to B-1 Finetune +2.
  157.         dw 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to B-2 Finetune +2.
  158.         dw 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to B-3 Finetune +2.
  159.  
  160.         dw 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to B-1 Finetune +3.
  161.         dw 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to B-2 Finetune +3.
  162.         dw 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to B-3 Finetune +3.
  163.  
  164.         dw 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to B-1 Finetune +4.
  165.         dw 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to B-2 Finetune +4.
  166.         dw 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to B-3 Finetune +4.
  167.  
  168.         dw 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to B-1 Finetune +5.
  169.         dw 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to B-2 Finetune +5.
  170.         dw 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to B-3 Finetune +5.
  171.  
  172.         dw 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to B-1 Finetune +6.
  173.         dw 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to B-2 Finetune +6.
  174.         dw 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to B-3 Finetune +6.
  175.  
  176.         dw 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to B-1 Finetune +7.
  177.         dw 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to B-2 Finetune +7.
  178.         dw 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to B-3 Finetune +7.
  179.  
  180.         dw 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to B-1 Finetune -8.
  181.         dw 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to B-2 Finetune -8.
  182.         dw 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to B-3 Finetune -8.
  183.  
  184.         dw 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to B-1 Finetune -7.
  185.         dw 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to B-2 Finetune -7.
  186.         dw 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to B-3 Finetune -7.
  187.  
  188.         dw 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to B-1 Finetune -6.
  189.         dw 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to B-2 Finetune -6.
  190.         dw 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to B-3 Finetune -6.
  191.  
  192.         dw 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to B-1 Finetune -5.
  193.         dw 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to B-2 Finetune -5.
  194.         dw 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to B-3 Finetune -5.
  195.  
  196.         dw 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to B-1 Finetune -4.
  197.         dw 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to B-2 Finetune -4.
  198.         dw 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to B-3 Finetune -4.
  199.  
  200.         dw 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to B-1 Finetune -3.
  201.         dw 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to B-2 Finetune -3.
  202.         dw 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to B-3 Finetune -3.
  203.  
  204.         dw 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to B-1 Finetune -2.
  205.         dw 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to B-2 Finetune -2.
  206.         dw 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to B-3 Finetune -2.
  207.  
  208.         dw 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to B-1 Finetune -1.
  209.         dw 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to B-2 Finetune -1.
  210.         dw 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to B-3 Finetune -1.
  211.  
  212. GusVol        dw 28000,40048,43216,43856,44496,47104,47424,47696,48000,48272
  213.         dw 48544,48832,49120,51312,51440,51584,51712,51840,51968,52096
  214.         dw 52208,52336,52464,52592,52704,52848,52960,53072,53200,55328
  215.         dw 55392,55456,55504,55568,55648,55696,55744,55824,55872,55920
  216.         dw 55984,56032,56096,56144,56208,56272,56320,56384,56448,56512
  217.         dw 56544,56608,56688,56720,56784,56832,56896,56928,57008,57040
  218.         dw 57120,57168,57232,57280
  219.  
  220. SampOffset    dd 31 dup (0)
  221. SampLen        dw 31 dup (0)
  222. SampVol        dw 31 dup (0)
  223. SampFine    dw 31 dup (0)
  224. SampRep        dw 31 dup (0)
  225. SampRepLen    dw 31 dup (0)
  226.  
  227. FileHandle    dw 0
  228. NumChans    dw 4            ; 4,6 or 8 (Defualt = 4)
  229. ChanOn        dw 0FFh
  230. ChanOnCount    dw 0
  231. PatternSpeed    dw 0
  232. PatternCount    dw 0
  233. PatternRow    dw 0
  234. PlayingPattern    dw 0
  235. MainVolume    dw 64
  236.  
  237. FreqTable    dw 908 dup (0)
  238.  
  239. PatternPek    equ this DWord
  240. BytePattern    dw 0
  241. SegPattern    dw 0
  242.  
  243. SampMem        dw 0
  244. PatternMem    dw 0
  245. BreakData    dw 0
  246. OldTimer    dd 0
  247. GUSMem        dd 0
  248. Speed        dd 0
  249. SpeedAdd    dd 0
  250. Counter        dw 0
  251.  
  252. SampChans    ChanInfo 8 dup (<>)
  253.  
  254. ;     Macros
  255.  
  256. NopLoop        Macro    Nops
  257. Local    NopLoop
  258.  
  259.     push    cx
  260.     mov    cx,Nops
  261. NopLoop:
  262.     nop
  263.     loop    NopLoop
  264.     pop    cx
  265.  
  266.         EndM
  267.  
  268. ;    The Code
  269.  
  270. Even
  271.  
  272.     assume    ds:_Code
  273.  
  274. Pattern        Proc    Near
  275.  
  276.     pusha
  277.     push    ds
  278.     push    es
  279.  
  280.     mov    ax,_Code
  281.     mov    ds,ax
  282.  
  283.     mov    al,20h
  284.     out    20h,al
  285.     sti
  286.  
  287.     inc    [Counter]
  288.     mov    ax,Word Ptr [Speed+2]
  289.     add    Word Ptr [SpeedAdd+2],ax
  290.     mov    ax,Word Ptr [Speed]
  291.     adc    Word Ptr [SpeedAdd],ax
  292.     jc    JumpPattern
  293.     cmp    [Counter],4
  294.     je    ClearNotes
  295.     cmp    [Counter],5
  296.     je    SetNotes
  297.     jmp    EndPattern
  298.  
  299. ClearNotes:
  300.     mov    di,offset [SampChans]
  301.     mov    cx,[NumChans]
  302.  
  303. StopVoices:
  304.     mov    dx,ActiveVoicePort    ; Set voice
  305.     mov    al,Byte Ptr [NumChans]
  306.     sub    al,cl
  307.     out    dx,al
  308.  
  309.     cmp    [di.InstSet],2
  310.     je    VoiceOff1
  311.     cmp    [di.InstSet],1
  312.     je    VoiceOff2
  313.     cmp    [di.OffsetAdd],0
  314.     jne    VoiceOff1
  315.     jmp    NoVoiceOff
  316.  
  317. VoiceOff2:
  318.     mov    ax,[di.CurrSamp]
  319.     cmp    ax,[di.OldSamp]
  320.     jne    VoiceOff1
  321.     jmp    NoVoiceOff
  322.  
  323. VoiceOff1:
  324.     mov    dx,CommandPort
  325.     mov    al,VolumeCtrl
  326.     out    dx,al
  327.     mov    dx,DataHighPort
  328.     mov    al,3
  329.     out    dx,al
  330.  
  331.     mov    dx,CommandPort
  332.     mov    al,SetVolume
  333.     out    dx,al
  334.     mov    dx,DataLowPort
  335.     mov    al,0
  336.     out    dx,al
  337.  
  338.     mov    dx,CommandPort
  339.     mov    al,ReadVolume
  340.     out    dx,al
  341.     mov    dx,DataHighPort
  342.     in    al,dx
  343.  
  344.     mov    bh,al
  345.     mov    bl,Byte Ptr [GusVol+1]
  346.  
  347.     mov    ah,0
  348.     cmp    bh,bl
  349.     je    NoVoiceOff
  350.     jb    NoFixVolDir2
  351.     mov    ah,01000000b
  352.     xchg    bh,bl
  353. NoFixVolDir2:
  354.  
  355.     mov    dx,CommandPort
  356.     mov    al,VolRampStart
  357.     out    dx,al
  358.     mov    al,bh
  359.     mov    dx,DataHighPort
  360.     out    dx,al
  361.     
  362.     mov    dx,CommandPort
  363.     mov    al,VolRampEnd
  364.     out    dx,al
  365.     mov    al,bl
  366.     mov    dx,DataHighPort
  367.     out    dx,al
  368.  
  369.     mov    dx,CommandPort
  370.     mov    al,VolumeCtrl
  371.     out    dx,al
  372.     mov    al,ah
  373.     mov    dx,DataHighPort
  374.     out    dx,al
  375. NoVoiceOff:
  376.  
  377.     add    di,ChanSize
  378.     dec    cx
  379.     jnz    StopVoices
  380.     jmp    EndPattern
  381.  
  382. SetNotes:
  383.     mov    [Counter],1
  384.     mov    di,offset [SampChans]
  385.     mov    cx,[NumChans]
  386.  
  387. ChangeSamps:
  388.     mov    dx,ActiveVoicePort    ; Set voice
  389.     mov    al,Byte Ptr [NumChans]
  390.     sub    al,cl
  391.     out    dx,al
  392.  
  393.     cmp    [di.InstSet],2
  394.     je    SampChange1
  395.     cmp    [di.InstSet],1
  396.     je    SampChange2
  397.     cmp    [di.OffsetAdd],0
  398.     jne    ChangeOffset
  399.     jmp    NoChangeSamp
  400.  
  401. ChangeOffset:
  402.     mov    [di.OldVol],0
  403.     mov    dx,CommandPort        ; Sample offset
  404.     mov    al,SampleStartLo
  405.     out    dx,al
  406.     mov    dx,DataLowPort
  407.     mov    ax,Word Ptr [di.SampOff]
  408.     mov    bp,Word Ptr [di.SampOff+2]
  409.     add    ax,[di.OffsetAdd]
  410.     adc    bp,0
  411.     shr    ax,7
  412.     shl    bp,9
  413.     or    ax,bp
  414.     out    dx,ax
  415.     mov    dx,CommandPort
  416.     mov    al,SampleStartHi
  417.     out    dx,al
  418.     mov    dx,DataLowPort
  419.     mov    ax,Word Ptr [di.SampOff]
  420.     add    ax,[di.OffsetAdd]
  421.     shl    ax,9
  422.     out    dx,ax
  423.     mov    dx,BasePort
  424.     Rept    6
  425.     in    al,dx
  426.     EndM
  427.     jmp    NoChangeSamp
  428.  
  429. SampChange1:
  430.     mov    [di.OldVol],0
  431.     mov    dx,CommandPort
  432.     mov    al,WriteVoiceMode
  433.     out    dx,al
  434.     mov    dx,DataHighPort
  435.     mov    al,3
  436.     out    dx,al
  437.     mov    dx,BasePort
  438.     Rept    6
  439.     in    al,dx
  440.     EndM
  441.  
  442.     mov    dx,CommandPort        ; Sample offset
  443.     mov    al,SampleStartLo
  444.     out    dx,al
  445.     mov    dx,DataLowPort
  446.     mov    ax,Word Ptr [di.SampOff]
  447.     mov    bp,Word Ptr [di.SampOff+2]
  448.     add    ax,[di.OffsetAdd]
  449.     adc    bp,0
  450.     shr    ax,7
  451.     shl    bp,9
  452.     or    ax,bp
  453.     out    dx,ax
  454.     mov    dx,CommandPort
  455.     mov    al,SampleStartHi
  456.     out    dx,al
  457.     mov    dx,DataLowPort
  458.     mov    ax,Word Ptr [di.SampOff]
  459.     add    ax,[di.OffsetAdd]
  460.     shl    ax,9
  461.     out    dx,ax
  462.     mov    dx,BasePort
  463.     Rept    6
  464.     in    al,dx
  465.     EndM
  466.  
  467.     mov    ax,[di.OldSamp]
  468.     cmp    ax,[di.CurrSamp]
  469.     je    NoChangeSamp
  470.  
  471.     mov    dx,CommandPort        ; Sample length
  472.     mov    al,SampleEndLo
  473.     out    dx,al
  474.     mov    dx,DataLowPort
  475.     mov    ax,Word Ptr [di.SampOff]
  476.     mov    bp,Word Ptr [di.SampOff+2]
  477.     add    ax,[di.Len]
  478.     adc    bp,0
  479.     shr    ax,7
  480.     shl    bp,9
  481.     or    ax,bp
  482.     out    dx,ax
  483.     mov    dx,CommandPort
  484.     mov    al,SampleEndHi
  485.     out    dx,al
  486.     mov    dx,DataLowPort
  487.     mov    ax,Word Ptr [di.SampOff]
  488.     add    ax,[di.Len]
  489.     shl    ax,9
  490.     out    dx,ax
  491.  
  492.     mov    dx,CommandPort        ; Sample repeat
  493.     mov    al,LoopStartLo
  494.     out    dx,al
  495.     mov    dx,DataLowPort
  496.     mov    ax,Word Ptr [di.SampOff]
  497.     mov    bp,Word Ptr [di.SampOff+2]
  498.     add    ax,[di.Repeat]
  499.     adc    bp,0
  500.     shr    ax,7
  501.     shl    bp,9
  502.     or    ax,bp
  503.     out    dx,ax
  504.     mov    dx,CommandPort
  505.     mov    al,LoopStartHi
  506.     out    dx,al
  507.     mov    dx,DataLowPort
  508.     mov    ax,Word Ptr [di.SampOff]
  509.     add    ax,[di.Repeat]
  510.     shl    ax,9
  511.     out    dx,ax
  512.     mov    dx,CommandPort
  513.     mov    al,WriteVoiceMode
  514.     out    dx,al
  515.     mov    dx,DataHighPort
  516.     mov    al,3
  517.     out    dx,al
  518.     jmp    NoChangeSamp
  519.  
  520. SampChange2:
  521.     mov    ax,[di.OldSamp]
  522.     cmp    ax,[di.CurrSamp]
  523.     je    NoChangeSamp
  524.  
  525.     mov    [di.OldVol],0
  526.     mov    dx,CommandPort
  527.     mov    al,WriteVoiceMode
  528.     out    dx,al
  529.     mov    dx,DataHighPort
  530.     mov    al,3
  531.     out    dx,al
  532.     mov    dx,BasePort
  533.     Rept    6
  534.     in    al,dx
  535.     EndM
  536.  
  537.     mov    dx,CommandPort
  538.     mov    al,VoicePosLo
  539.     out    dx,al
  540.     mov    dx,DataLowPort
  541.     in    ax,dx
  542.     mov    bx,ax
  543.     mov    dx,CommandPort
  544.     mov    al,VoicePosHi
  545.     out    dx,al
  546.     mov    dx,DataLowPort
  547.     in    ax,dx
  548.     xchg    ax,bx
  549.     mov    dx,ax
  550.     shl    ax,7
  551.     shr    dx,9
  552.     shr    bx,9
  553.     and    bx,7Fh
  554.     or    ax,bx
  555.     mov    bx,[di.OldSamp]
  556.     dec    bx
  557.     shl    bx,2
  558.     sub    ax,Word Ptr [SampOffset+bx]
  559.     mov    bx,ax
  560.     cmp    bx,[di.Len]
  561.     jb    NoFixStart
  562.     mov    bx,[di.Len]
  563.     dec    bx
  564. NoFixStart:
  565.  
  566.     cmp    [di.OffsetAdd],0
  567.     jne    NoOffsetEff
  568.     mov    [di.OffsetAdd],bx
  569. NoOffsetEff:
  570.  
  571.     mov    dx,CommandPort        ; Sample offset
  572.     mov    al,SampleStartLo
  573.     out    dx,al
  574.     mov    dx,DataLowPort
  575.     mov    ax,Word Ptr [di.SampOff]
  576.     mov    bp,Word Ptr [di.SampOff+2]
  577.     add    ax,[di.OffsetAdd]
  578.     adc    bp,0
  579.     shr    ax,7
  580.     shl    bp,9
  581.     or    ax,bp
  582.     out    dx,ax
  583.     mov    dx,CommandPort
  584.     mov    al,SampleStartHi
  585.     out    dx,al
  586.     mov    dx,DataLowPort
  587.     mov    ax,Word Ptr [di.SampOff]
  588.     add    ax,[di.OffsetAdd]
  589.     shl    ax,9
  590.     out    dx,ax
  591.     mov    dx,BasePort
  592.     Rept    6
  593.     in    al,dx
  594.     EndM
  595.  
  596.     mov    dx,CommandPort        ; Sample length
  597.     mov    al,SampleEndLo
  598.     out    dx,al
  599.     mov    dx,DataLowPort
  600.     mov    ax,Word Ptr [di.SampOff]
  601.     mov    bp,Word Ptr [di.SampOff+2]
  602.     add    ax,[di.Len]
  603.     adc    bp,0
  604.     shr    ax,7
  605.     shl    bp,9
  606.     or    ax,bp
  607.     out    dx,ax
  608.     mov    dx,CommandPort
  609.     mov    al,SampleEndHi
  610.     out    dx,al
  611.     mov    dx,DataLowPort
  612.     mov    ax,Word Ptr [di.SampOff]
  613.     add    ax,[di.Len]
  614.     shl    ax,9
  615.     out    dx,ax
  616.  
  617.     mov    dx,CommandPort        ; Sample repeat
  618.     mov    al,LoopStartLo
  619.     out    dx,al
  620.     mov    dx,DataLowPort
  621.     mov    ax,Word Ptr [di.SampOff]
  622.     mov    bp,Word Ptr [di.SampOff+2]
  623.     add    ax,[di.Repeat]
  624.     adc    bp,0
  625.     shr    ax,7
  626.     shl    bp,9
  627.     or    ax,bp
  628.     out    dx,ax
  629.     mov    dx,CommandPort
  630.     mov    al,LoopStartHi
  631.     out    dx,al
  632.     mov    dx,DataLowPort
  633.     mov    ax,Word Ptr [di.SampOff]
  634.     add    ax,[di.Repeat]
  635.     shl    ax,9
  636.     out    dx,ax
  637.     mov    dx,CommandPort
  638.     mov    al,WriteVoiceMode
  639.     out    dx,al
  640.     mov    dx,DataHighPort
  641.     mov    al,3
  642.     out    dx,al
  643.  
  644.     mov    dx,CommandPort
  645.     mov    al,WriteVoiceMode
  646.     out    dx,al
  647.     mov    dx,DataHighPort
  648.     mov    al,Byte Ptr [di.LoopOnOff]
  649.     out    dx,al
  650.     mov    dx,BasePort
  651.     Rept    6
  652.     in    al,dx
  653.     EndM
  654. NoChangeSamp:
  655.  
  656.     mov    ax,[Counter]
  657.     test    [ChanOn],ax
  658.     je    NoSetVol
  659.  
  660.     mov    ax,[di.Vol]
  661.     cmp    ax,[di.OldVol]
  662.     jne    DoRampVol
  663.  
  664.     mov    dx,CommandPort
  665.     mov    al,ReadVolCtrl
  666.     out    dx,al
  667.     mov    dx,DataHighPort
  668.     in    al,dx
  669.     test    al,1
  670.     je    NoSetVol
  671.  
  672.     mov    dx,CommandPort
  673.     mov    al,SetVolume
  674.     out    dx,al
  675.     mov    ax,[di.Vol]
  676.     mov    bx,[MainVolume]
  677.     mul    bx
  678.     shr    ax,6
  679.     mov    bx,ax
  680.     shl    bx,1
  681.     mov    ax,[GusVol+bx]
  682.     mov    dx,DataLowPort
  683.     out    dx,al
  684.     mov    dx,BasePort
  685.     Rept    6
  686.     in    al,dx
  687.     EndM
  688.     jmp    NoSetVol
  689.  
  690. DoRampVol:
  691.     mov    dx,CommandPort
  692.     mov    al,VolumeCtrl
  693.     out    dx,al
  694.     mov    dx,DataHighPort
  695.     mov    al,3
  696.     out    dx,al
  697.  
  698.     mov    dx,CommandPort
  699.     mov    al,SetVolume
  700.     out    dx,al
  701.     mov    dx,DataLowPort
  702.     mov    al,0
  703.     out    dx,al
  704.  
  705.     mov    dx,CommandPort
  706.     mov    al,ReadVolume
  707.     out    dx,al
  708.     mov    dx,DataHighPort
  709.     in    al,dx
  710.     mov    bh,al
  711.  
  712.     mov    ax,[di.Vol]
  713.     mov    bp,[MainVolume]
  714.     mul    bp
  715.     shr    ax,6
  716.     mov    bp,ax
  717.     shl    bp,1
  718.     mov    bl,Byte Ptr [GusVol+bp+1]
  719.     cmp    bh,bl
  720.  
  721.     mov    ah,0
  722.     cmp    bh,bl
  723.     jb    NoFixVolDir
  724.     mov    ah,01000000b
  725.     xchg    bh,bl
  726. NoFixVolDir:
  727.  
  728.     mov    dx,CommandPort
  729.     mov    al,VolRampStart
  730.     out    dx,al
  731.     mov    al,bh
  732.     mov    dx,DataHighPort
  733.     out    dx,al
  734.     
  735.     mov    dx,CommandPort
  736.     mov    al,VolRampEnd
  737.     out    dx,al
  738.     mov    al,bl
  739.     mov    dx,DataHighPort
  740.     out    dx,al
  741.  
  742.     mov    dx,CommandPort
  743.     mov    al,VolumeCtrl
  744.     out    dx,al
  745.     mov    al,ah
  746.     mov    dx,DataHighPort
  747.     out    dx,al
  748. NoSetVol:
  749.  
  750.     mov    dx,CommandPort        ; Frequency
  751.     mov    al,SetVoiceFreq
  752.     out    dx,al
  753.     mov    dx,DataLowPort
  754.     mov    ax,[di.FreqVal]
  755.     out    dx,ax
  756.  
  757.     shl    [Counter],1
  758.     add    di,ChanSize
  759.     dec    cx
  760.     jnz    ChangeSamps
  761.  
  762.     mov    di,offset [SampChans]
  763.     mov    cx,[NumChans]
  764.  
  765. StartVoices:
  766.     mov    dx,ActiveVoicePort    ; Set voice
  767.     mov    al,Byte Ptr [NumChans]
  768.     sub    al,cl
  769.     out    dx,al
  770.  
  771.     cmp    [di.InstSet],2
  772.     jne    NoVoiceStart
  773.  
  774.     mov    dx,CommandPort        ; Voice start
  775.     mov    al,WriteVoiceMode
  776.     out    dx,al
  777.     mov    dx,DataHighPort
  778.     mov    al,Byte Ptr [di.LoopOnOff]
  779.     out    dx,al
  780.     mov    dx,BasePort
  781.     Rept    6
  782.     in    al,dx
  783.     EndM
  784. NoVoiceStart:
  785.  
  786.     mov    [di.InstSet],0
  787.     mov    [di.OffsetAdd],0
  788.  
  789.     add    di,ChanSize
  790.     dec    cx
  791.     jnz    StartVoices
  792.     jmp    EndPattern
  793.  
  794. JumpPattern:
  795.  
  796.     mov    [Counter],0
  797.  
  798.     dec    Word Ptr [PatternCount]
  799.     jnz    DoEffects
  800.     jmp    DoPattern
  801. DoEffects:
  802.  
  803.     mov    di,offset [SampChans]
  804.     mov    cx,[NumChans]
  805.  
  806. EffectLoop:
  807.  
  808.     mov    ax,[di.Vol]
  809.     mov    [di.OldVol],ax
  810.  
  811.     inc    [di.EffectTime]
  812.     add    [di.ArpCounter],2
  813.     cmp    [di.ArpCounter],6
  814.     jb    NoWrapArp
  815.     mov    [di.ArpCounter],0
  816. NoWrapArp:
  817.     mov    ax,[di.Effect]
  818.     cmp    ax,0
  819.     jne    DoEffect
  820.     jmp    NoEffect
  821. DoEffect:
  822.     mov    bl,al
  823.     mov    bh,0
  824.     shl    bx,1
  825.     jmp    [EffectJumps+bx]
  826. Arpeggio:
  827.     mov    bx,[di.ArpCounter]
  828.     mov    bx,[di.Arp+bx]
  829.     shl    bx,1
  830.     mov    ax,Word Ptr [FreqTable+bx]
  831.     mov    [di.FreqVal],ax
  832.     jmp    NoEffect
  833. PortUp:
  834.     xchg    ah,al
  835.     mov    ah,0
  836.     mov    bp,[di.Fine]
  837.     mov    bp,[AmigaVals+35*2+bp]
  838.     mov    bx,[di.Amiga]
  839.     sub    bx,ax
  840.     jnc    NoFix1
  841.     mov    bx,bp
  842. NoFix1:
  843.     cmp    bx,bp
  844.     jae    NotSmall1
  845.     mov    bx,bp
  846. NotSmall1:
  847.     mov    [di.Amiga],bx
  848.     shl    bx,1
  849.     mov    ax,[FreqTable+bx]
  850.     mov    [di.FreqVal],ax
  851.     jmp    NoEffect
  852. PortDown:
  853.     xchg    ah,al
  854.     mov    ah,0
  855.     mov    bp,[di.Fine]
  856.     mov    bp,[AmigaVals+bp]
  857.     mov    bx,[di.Amiga]
  858.     add    bx,ax
  859.     cmp    bx,bp
  860.     jbe    NotBig1
  861.     mov    bx,bp
  862. NotBig1:
  863.     mov    [di.Amiga],bx
  864.     shl    bx,1
  865.     mov    ax,[FreqTable+bx]
  866.     mov    [di.FreqVal],ax
  867.     jmp    NoEffect
  868. PortToTone:
  869.     xchg    ah,al
  870.     xor    ah,ah
  871.     mov    dx,[di.PortTo]
  872.     mov    bx,[di.Amiga]
  873.     cmp    bx,dx
  874.     jae    NoPortToUp
  875.     add    bx,ax
  876.     cmp    bx,dx
  877.     jna    NoPortToUp
  878.     mov    [di.Amiga],dx
  879. NoPortToUp:
  880.     cmp    bx,dx
  881.     jbe    NoPortToDown
  882.     sub    bx,ax
  883.     jnc    NoPortToError
  884.     mov    bx,dx
  885. NoPortToError:
  886.     cmp    bx,dx
  887.     jnb    NoPortToDown
  888.     mov    bx,dx
  889. NoPortToDown:
  890.     mov    [di.Amiga],bx
  891.     shl    bx,1
  892.     mov    ax,[FreqTable+bx]
  893.     mov    [di.FreqVal],ax
  894.     jmp    NoEffect
  895. Vibrato:
  896.     mov    bp,[di.Fine]
  897.     mov    si,[AmigaVals+bp]
  898.     mov    bp,[AmigaVals+35*2+bp]
  899.     mov    dl,ah
  900.     and    ah,0F0h
  901.     shr    ah,2
  902.     and    dl,0Fh
  903.     mov    bl,Byte Ptr [di.VibratoPek]
  904.     add    bl,ah
  905.     mov    Byte Ptr [di.VibratoPek],bl
  906.     shr    bl,2
  907.     and    bx,1Fh
  908.     mov    al,[SinTab+bx]
  909.     mul    dl
  910.     rol    ax,1
  911.     xchg    ah,al
  912.     and    ah,1
  913.     test    Byte Ptr [di.VibratoPek],128
  914.     jne    VibUp1
  915.     neg    ax
  916. VibUp1:
  917.     add    ax,[di.Amiga]
  918.     cmp    ax,bp
  919.     jae    NoHighVibrato1
  920.     mov    ax,bp
  921. NoHighVibrato1:
  922.     cmp    ax,si
  923.     jbe    NoLowVibrato1
  924.     mov    ax,si
  925. NoLowVibrato1:
  926.     shl    ax,1
  927.     mov    bx,ax
  928.     mov    ax,[FreqTable+bx]
  929.     mov    [di.FreqVal],ax
  930.     jmp    NoEffect
  931. PortToVSlide:
  932.     mov    al,ah
  933.     and    ah,0Fh
  934.     shr    al,4
  935.     sub    ah,al
  936.     mov    al,Byte Ptr [di.Vol]
  937.     sub    al,ah
  938.     jns    NoSlideLow2
  939.     mov    al,0
  940. NoSlideLow2:
  941.     cmp    al,40h
  942.     jb    NoSlideHigh2
  943.     mov    al,3Fh
  944. NoSlideHigh2:
  945.     mov    Byte Ptr [di.Vol],al
  946.     mov    ax,[di.OldPortTo]
  947.     mov    dx,[di.PortTo]
  948.     mov    bx,[di.Amiga]
  949.     cmp    bx,dx
  950.     jae    NoPortToUp2
  951.     add    bx,ax
  952.     cmp    bx,dx
  953.     jna    NoPortToUp2
  954.     mov    [di.Amiga],dx
  955. NoPortToUp2:
  956.     cmp    bx,dx
  957.     jbe    NoPortToDown2
  958.     sub    bx,ax
  959.     jnc    NoPortToError2
  960.     mov    bx,0
  961. NoPortToError2:
  962.     cmp    bx,dx
  963.     jnb    NoPortToDown2
  964.     mov    bx,dx
  965. NoPortToDown2:
  966.     mov    [di.Amiga],bx
  967.     shl    bx,1
  968.     mov    ax,Word Ptr [FreqTable+bx]
  969.     mov    [di.FreqVal],ax
  970.     jmp    NoEffect
  971. VibratoVSlide:
  972.     mov    al,ah
  973.     and    ah,0Fh
  974.     shr    al,4
  975.     sub    ah,al
  976.     mov    al,Byte Ptr [di.Vol]
  977.     sub    al,ah
  978.     jns    NoSlideLow3
  979.     mov    al,0
  980. NoSlideLow3:
  981.     cmp    al,40h
  982.     jb    NoSlideHigh3
  983.     mov    al,3Fh
  984. NoSlideHigh3:
  985.     mov    Byte Ptr [di.Vol],al
  986.     mov    bp,[di.Fine]
  987.     mov    si,[AmigaVals+bp]
  988.     mov    bp,[AmigaVals+35*2+bp]
  989.     mov    ah,Byte Ptr [di.OldVibrato]
  990.     or    ah,Byte Ptr [di.OldVibrato+1]
  991.     mov    dl,ah
  992.     and    ah,0F0h
  993.     shr    ah,2
  994.     and    dl,0Fh
  995.     mov    bl,Byte Ptr [di.VibratoPek]
  996.     add    bl,ah
  997.     mov    Byte Ptr [di.VibratoPek],bl
  998.     shr    bl,2
  999.     and    bx,1Fh
  1000.     mov    al,[SinTab+bx]
  1001.     mul    dl
  1002.     rol    ax,1
  1003.     xchg    ah,al
  1004.     and    ah,1
  1005.     test    Byte Ptr [di.VibratoPek],128
  1006.     jne    VibUp2
  1007.     neg    ax
  1008. VibUp2:
  1009.     add    ax,[di.Amiga]
  1010.     cmp    ax,bp
  1011.     jae    NoHighVibrato2
  1012.     mov    ax,bp
  1013. NoHighVibrato2:
  1014.     cmp    ax,si
  1015.     jbe    NoLowVibrato2
  1016.     mov    ax,si
  1017. NoLowVibrato2:
  1018.     shl    ax,1
  1019.     mov    bx,ax
  1020.     mov    ax,[FreqTable+bx]
  1021.     mov    [di.FreqVal],ax
  1022.     jmp    NoEffect
  1023. VolSlide:
  1024.     mov    al,ah
  1025.     and    ah,0Fh
  1026.     shr    al,4
  1027.     sub    ah,al
  1028.     mov    al,Byte Ptr [di.Vol]
  1029.     sub    al,ah
  1030.     jns    NoSlideLow1
  1031.     mov    al,0
  1032. NoSlideLow1:
  1033.     cmp    al,40h
  1034.     jb    NoSlideHigh1
  1035.     mov    al,3Fh
  1036. NoSlideHigh1:
  1037.     mov    Byte Ptr [di.Vol],al
  1038.     jmp    NoEffect
  1039. NoEffect:
  1040.  
  1041.     add    di,ChanSize
  1042.     dec    cx
  1043.     jz    EndEffects
  1044.     jmp    EffectLoop
  1045. EndEffects:
  1046.     jmp    EndPattern
  1047.  
  1048. DoPattern:
  1049.     mov    ax,[PatternSpeed]
  1050.     mov    [PatternCount],ax
  1051.     cmp    [PatternRow],64
  1052.     jb    NoPatternWrap
  1053.     mov    ax,[PlayingPattern]
  1054.     cmp    al,[OrderLen]
  1055.     jb    NoTrackWrap
  1056.     mov    [PlayingPattern],0
  1057. NoTrackWrap:
  1058.     mov    bx,[PlayingPattern]
  1059.     mov    ah,0
  1060.     mov    al,[PatternOrder+bx]
  1061.     mov    dx,[NumChans]
  1062.     shl    dx,8
  1063.     mul    dx
  1064.     shl    dx,12
  1065.     add    dx,[PatternMem]
  1066.     mov    [SegPattern],dx
  1067.     mov    [BytePattern],ax
  1068.     mov    ax,[BreakData]
  1069.     mov    [PatternRow],ax
  1070.     shl    ax,4
  1071.     add    [BytePattern],ax
  1072.     mov    [BreakData],0
  1073.     inc    [PlayingPattern]
  1074. NoPatternWrap:
  1075.  
  1076.     les    si,[PatternPek]
  1077.     mov    di,offset [SampChans]
  1078.     mov    cx,[NumChans]
  1079.  
  1080. PattLoop:
  1081.  
  1082.     mov    ax,[di.Vol]
  1083.     mov    [di.OldVol],ax
  1084.  
  1085.     mov    bh,es:[si]        ; New Sample
  1086.     mov    bl,es:[si+2]
  1087.     and    bh,0F0h
  1088.     shr    bl,4
  1089.     add    bl,bh
  1090.     je    NoNewSample
  1091.     mov    bh,Byte Ptr [di.CurrSamp]
  1092.     mov    Byte Ptr [di.OldSamp],bh
  1093.     mov    Byte Ptr [di.CurrSamp],bl
  1094.     mov    bh,0
  1095.     dec    bx
  1096.     shl    bx,1
  1097.     mov    ax,[SampVol+bx]
  1098.     cmp    ax,40h
  1099.     jb    NoHighVol
  1100.     mov    ax,3Fh
  1101. NoHighVol:
  1102.     mov    [di.Vol],ax
  1103.     mov    [di.InstSet],1
  1104.     shl    bx,1
  1105.     mov    ax,Word Ptr [SampOffset+bx]
  1106.     mov    Word Ptr [di.SampOff],ax
  1107.     mov    ax,Word Ptr [SampOffset+bx+2]
  1108.     mov    Word Ptr [di.SampOff+2],ax
  1109.     shr    bx,1
  1110.     mov    ax,[SampFine+bx]
  1111.     shl    ax,3
  1112.     mov    [di.Fine],ax
  1113.     shl    ax,3
  1114.     add    [di.Fine],ax
  1115.     mov    [di.LoopOnOff],0
  1116.     mov    ax,[SampLen+bx]
  1117.     dec    ax
  1118.     mov    [di.Len],ax
  1119.     mov    ax,[SampRep+bx]
  1120.     sub    ax,1
  1121.     jnc    NoFixRep
  1122.     mov    ax,0
  1123. NoFixRep:
  1124.     mov    [di.Repeat],ax
  1125.     mov    ax,[SampRepLen+bx]
  1126.     mov    [di.RepLen],ax
  1127.     cmp    ax,2
  1128.     jbe    NoNewSample
  1129.     mov    [di.LoopOnOff],8
  1130.     mov    ax,[di.Repeat]
  1131.     add    ax,[di.RepLen]
  1132.     mov    [di.Len],ax
  1133. NoNewSample:
  1134.  
  1135.     mov    bx,es:[si]
  1136.     xchg    bh,bl
  1137.     and    bx,0FFFh
  1138.     je    NoNewNote
  1139.     mov    bl,[ArpTable+bx]
  1140.     mov    bh,0
  1141.     add    bx,[di.Fine]
  1142.     mov    bx,[AmigaVals+bx]
  1143.     mov    [di.PortTo],bx
  1144.     mov    al,es:[si+2]
  1145.     and    al,0Fh
  1146.     cmp    al,03h
  1147.     je    NoNewNote
  1148.     cmp    al,05h
  1149.     je    NoNewNote
  1150.     mov    [di.InstSet],2
  1151.     mov    [di.VibratoPek],0
  1152.     mov    [di.Amiga],bx
  1153.     shl    bx,1
  1154.     mov    ax,Word Ptr [FreqTable+bx]
  1155.     mov    [di.FreqVal],ax
  1156. NoNewNote:
  1157.  
  1158.     mov    [di.ArpCounter],0
  1159.     mov    ax,es:[si+2]
  1160.     and    al,0Fh
  1161.     mov    [di.Effect],ax
  1162.     cmp    al,7
  1163.     jb    NoSetOldFreq
  1164.     mov    bx,ax
  1165.     and    bh,0F0h
  1166.     cmp    bx,0C00Eh
  1167.     je    NoSetOldFreq
  1168.     cmp    bx,0D00Eh
  1169.     je    NoSetOldFreq
  1170.     mov    bx,[di.Amiga]
  1171.     shl    bx,1
  1172.     mov    bx,[FreqTable+bx]
  1173.     mov    [di.FreqVal],bx
  1174. NoSetOldFreq:
  1175.     mov    bl,al
  1176.     mov    bh,0
  1177.     shl    bx,1
  1178.     jmp    [PattJumps+bx]
  1179. ArpeggioFix:
  1180.     mov    bx,[di.Amiga]
  1181.     mov    bl,[ArpTable+bx]
  1182.     mov    bh,0
  1183.     mov    bp,bx
  1184.     add    bx,[di.Fine]
  1185.     mov    dx,[AmigaVals+bx]
  1186.     mov    [di.Arp],dx
  1187.     xchg    ah,al
  1188.     mov    ah,0
  1189.     mov    dx,ax
  1190.     shr    dx,4
  1191.     and    ax,0Fh
  1192.     shl    dx,1
  1193.     shl    ax,1
  1194.     mov    bx,bp
  1195.     add    bx,dx
  1196.     cmp    bx,70
  1197.     jbe    NoWrapArp1
  1198.     mov    bx,70
  1199. NoWrapArp1:
  1200.     add    bx,[di.Fine]
  1201.     mov    dx,[AmigaVals+bx]
  1202.     mov    [di.Arp+2],dx
  1203.     mov    bx,bp
  1204.     add    bx,ax
  1205.     cmp    bx,70
  1206.     jbe    NoWrapArp2
  1207.     mov    bx,70
  1208. NoWrapArp2:
  1209.     add    bx,[di.Fine]
  1210.     mov    dx,[AmigaVals+bx]
  1211.     mov    [di.Arp+4],dx
  1212.     jmp    NoPattEffect
  1213. PortToFix:
  1214.     cmp    ah,0
  1215.     jne    NoPortPekFix
  1216.     mov    ah,Byte Ptr [di.OldPortTo]
  1217. NoPortPekFix:
  1218.     mov    Byte Ptr [di.OldPortTo],ah
  1219.     mov    Byte Ptr [di.Effect+1],ah
  1220.     jmp    NoPattEffect
  1221. VibratoFix:
  1222.     mov    al,ah
  1223.     and    al,0Fh
  1224.     and    ah,0F0h
  1225.     cmp    al,0
  1226.     jne    NoVibratoFix1
  1227.     mov    al,Byte Ptr [di.OldVibrato]
  1228. NoVibratoFix1:
  1229.     cmp    ah,0
  1230.     jne    NoVibratoFix2
  1231.     mov    ah,Byte Ptr [di.OldVibrato+1]
  1232. NoVibratoFix2:
  1233.     mov    Byte Ptr [di.OldVibrato],al
  1234.     mov    Byte Ptr [di.OldVibrato+1],ah
  1235.     or    al,ah
  1236.     mov    Byte Ptr [di.Effect+1],al
  1237.     jmp    NoPattEffect
  1238. SampleOff:
  1239.     mov    al,0
  1240.     cmp    ax,[di.Len]
  1241.     jb    NoFixOffset
  1242.     mov    ax,[di.Len]
  1243.     dec    ax
  1244. NoFixOffset:
  1245.     mov    [di.OffsetAdd],ax
  1246.     jmp    NoPattEffect
  1247. PosJump:
  1248.     mov    [PatternRow],63
  1249.     mov    Byte Ptr [PlayingPattern],ah
  1250.     jmp    NoPattEffect
  1251. Volume:
  1252.     cmp    ah,40h
  1253.     jb    NoFixVol1
  1254.     mov    ah,3Fh
  1255. NoFixVol1:
  1256.     mov    Byte Ptr [di.Vol],ah
  1257.     jmp    NoPattEffect
  1258. BreakPatt:
  1259.     mov    [PatternRow],63
  1260.     cmp    ah,64h
  1261.     jb    NoFixBreak
  1262.     mov    ah,63h
  1263. NoFixBreak:
  1264.     mov    al,ah
  1265.     and    al,0Fh
  1266.     shr    ah,4
  1267.     shl    ah,1
  1268.     mov    Byte Ptr [BreakData],al
  1269.     add    Byte Ptr [BreakData],ah
  1270.     shl    ah,2
  1271.     add    Byte Ptr [BreakData],ah
  1272.     jmp    NoPattEffect
  1273. SpeedSet:
  1274.     cmp    ah,0
  1275.     je    NoPattEffect
  1276.     cmp    ah,1Fh
  1277.     jbe    UsualSpeed
  1278.  
  1279.     xchg    ah,al
  1280.     mov    ah,0
  1281.     shl    ax,1            ;
  1282.     mov    bl,5            ; Denna bit är för att ställa
  1283.     div    bl            ; Effects till annat än 50Hz
  1284.     mov    dl,al            ; Detta ger automatiskt en annan
  1285.     mov    dh,0            ; patternspeed.; Hz=2*BPM/5
  1286.     mov    ax,0
  1287.     mov    bx,1000
  1288.     div    bx
  1289.     mov    Word Ptr cs:[Speed],ax
  1290.     mov    ax,0
  1291.     div    bx
  1292.     mov    Word Ptr cs:[Speed+2],ax
  1293.     jmp    NoPattEffect
  1294. UsualSpeed:
  1295.     mov    Byte Ptr [PatternSpeed],ah
  1296.     mov    Byte Ptr [PatternCount],ah
  1297.     jmp    NoPattEffect
  1298. NoPattEffect:
  1299.  
  1300.     add    si,4
  1301.     jnc    NoChangeSeg1
  1302.     mov    dx,es
  1303.     add    dx,1000h
  1304.     mov    es,dx
  1305. NoChangeSeg1:
  1306.     mov    [di.EffectTime],0
  1307.     add    di,ChanSize
  1308.     dec    cx
  1309.     jz    EndChannels
  1310.     jmp    PattLoop
  1311. EndChannels:
  1312.  
  1313.     inc    [PatternRow]
  1314.     mov    ax,[NumChans]
  1315.     shl    ax,2
  1316.     add    [BytePattern],ax
  1317.     jnc    EndPattern
  1318.     add    [SegPattern],1000h
  1319. EndPattern:
  1320.  
  1321.     pop    es
  1322.     pop    ds
  1323.     popa
  1324.     iret
  1325.  
  1326. Pattern        EndP
  1327.  
  1328. PattJumps    dw offset cs:[ArpeggioFix]    ; 0
  1329.         dw offset cs:[NoPattEffect]    ; 1
  1330.         dw offset cs:[NoPattEffect]    ; 2
  1331.         dw offset cs:[PortToFix]    ; 3
  1332.         dw offset cs:[VibratoFix]    ; 4
  1333.         dw offset cs:[NoPattEffect]    ; 5
  1334.         dw offset cs:[NoPattEffect]    ; 6
  1335.         dw offset cs:[NoPattEffect]    ; 7
  1336.         dw offset cs:[NoPattEffect]    ; 8
  1337.         dw offset cs:[SampleOff]    ; 9
  1338.         dw offset cs:[NoPattEffect]    ; A
  1339.         dw offset cs:[PosJump]        ; B
  1340.         dw offset cs:[Volume]        ; C
  1341.         dw offset cs:[BreakPatt]    ; D
  1342.         dw offset cs:[NoPattEffect]    ; E
  1343.         dw offset cs:[SpeedSet]        ; F
  1344.  
  1345. EffectJumps    dw offset cs:[Arpeggio]        ; 0
  1346.         dw offset cs:[PortUp]        ; 1
  1347.         dw offset cs:[PortDown]        ; 2
  1348.         dw offset cs:[PortToTone]    ; 3
  1349.         dw offset cs:[Vibrato]        ; 4
  1350.         dw offset cs:[PortToVSlide]    ; 5
  1351.         dw offset cs:[VibratoVSlide]    ; 6
  1352.         dw offset cs:[NoEffect]        ; 7
  1353.         dw offset cs:[NoEffect]        ; 8
  1354.         dw offset cs:[NoEffect]        ; 9
  1355.         dw offset cs:[VolSlide]        ; A
  1356.         dw offset cs:[NoEffect]        ; B
  1357.         dw offset cs:[NoEffect]        ; C
  1358.         dw offset cs:[NoEffect]        ; D
  1359.         dw offset cs:[NoEffect]        ; E
  1360.         dw offset cs:[NoEffect]        ; F
  1361.  
  1362.     assume    ds:nothing
  1363.  
  1364. StartPlaying    Proc    Far
  1365.  
  1366.     pusha
  1367.     push    ds
  1368.     push    es
  1369.  
  1370.     cli
  1371.     mov    ax,0
  1372.     mov    es,ax
  1373.  
  1374.     mov    bx,es:[20h]
  1375.     mov    ax,es:[22h]
  1376.     mov    Word Ptr cs:[OldTimer],bx
  1377.     mov    Word Ptr cs:[OldTimer+2],ax
  1378.  
  1379.     push    cs
  1380.     pop    ds
  1381.     mov    dx,offset cs:[Pattern]
  1382.  
  1383.     mov    es:[20h],dx
  1384.     mov    es:[22h],ds
  1385.  
  1386.     mov    al,36h
  1387.     out    43h,al
  1388.     mov    al,169
  1389.     out    40h,al
  1390.     mov    al,4
  1391.     out    40h,al
  1392.  
  1393.     mov    ax,0
  1394.     mov    dx,50
  1395.     mov    bx,1000
  1396.     div    bx
  1397.     mov    Word Ptr cs:[Speed],ax
  1398.     mov    ax,0
  1399.     div    bx
  1400.     mov    Word Ptr cs:[Speed+2],ax
  1401.     mov    Word Ptr cs:[SpeedAdd],0
  1402.     mov    Word Ptr cs:[SpeedAdd+2],0
  1403.     mov    [Counter],20
  1404.  
  1405.     mov    dx,BasePort    ; Speaker On!!!
  1406.     mov    al,00000001b
  1407.     out    dx,al
  1408.  
  1409.     sti
  1410.  
  1411.     pop    es
  1412.     pop    ds
  1413.     popa
  1414.     ret
  1415.  
  1416. StartPlaying    EndP
  1417.  
  1418. StopPlaying    Proc    Far
  1419.  
  1420.     pusha
  1421.     push    ds
  1422.     push    es
  1423.  
  1424.     cli
  1425.  
  1426.     mov    dx,BasePort    ; Speaker Off!!!
  1427.     mov    al,00000011b
  1428.     out    dx,al
  1429.  
  1430.     mov    ax,0
  1431.     mov    es,ax
  1432.  
  1433.     mov    al,36h
  1434.     out    43h,al
  1435.     mov    al,0
  1436.     out    40h,al
  1437.     mov    al,0
  1438.     out    40h,al
  1439.  
  1440.     mov    dx,Word Ptr cs:[OldTimer]
  1441.     mov    ds,Word Ptr cs:[OldTimer+2]
  1442.     mov    es:[20h],dx
  1443.     mov    es:[22h],ds
  1444.     sti
  1445.  
  1446.     mov    cx,NumVoices
  1447. VoiceClearL:
  1448.     mov    dx,ActiveVoicePort
  1449.     mov    al,cl
  1450.     dec    al
  1451.     out    dx,al
  1452.     inc    dx
  1453.     mov    al,0
  1454.     out    dx,al
  1455.     add    dx,2
  1456.     mov    al,3    ; Voice Off
  1457.     out    dx,al
  1458.     sub    dx,2
  1459.     mov    al,0Dh
  1460.     out    dx,al
  1461.     add    dx,2
  1462.     mov    al,3    ; Ramp Off
  1463.     out    dx,al
  1464.     loop    VoiceClearL
  1465.  
  1466.     pop    es
  1467.     pop    ds
  1468.     popa
  1469.     ret
  1470.  
  1471. StopPlaying    EndP
  1472.  
  1473. Init        Proc    Far
  1474.  
  1475.     pusha
  1476.     push    ds
  1477.     push    es
  1478.     mov    di,offset cs:[SampChans]
  1479.     mov    cs:[di.FreqVal],0
  1480.     mov    cs:[di.FreqVal+ChanSize],0
  1481.     mov    cs:[di.FreqVal+ChanSize*2],0
  1482.     mov    cs:[di.FreqVal+ChanSize*3],0
  1483.     mov    cs:[di.FreqVal+ChanSize*4],0
  1484.     mov    cs:[di.FreqVal+ChanSize*5],0
  1485.     mov    cs:[di.FreqVal+ChanSize*6],0
  1486.     mov    cs:[di.FreqVal+ChanSize*7],0
  1487.     mov    cs:[di.Vol],0
  1488.     mov    cs:[di.Vol+ChanSize],0
  1489.     mov    cs:[di.Vol+ChanSize*2],0
  1490.     mov    cs:[di.Vol+ChanSize*3],0
  1491.     mov    cs:[di.Vol+ChanSize*4],0
  1492.     mov    cs:[di.Vol+ChanSize*5],0
  1493.     mov    cs:[di.Vol+ChanSize*6],0
  1494.     mov    cs:[di.Vol+ChanSize*7],0
  1495.     mov    cs:[PatternRow],64
  1496.     mov    cs:[PlayingPattern],0
  1497.     mov    cs:[PatternSpeed],6
  1498.     mov    cs:[PatternCount],1
  1499.     pop    es
  1500.     pop    ds
  1501.     popa
  1502.     ret
  1503.  
  1504. Init        EndP
  1505.  
  1506. InitDevice    Proc    Far
  1507.  
  1508.     pusha
  1509.     push    es
  1510.     push    ds
  1511.  
  1512.     mov    si,108*2
  1513.     mov    bp,108
  1514.     mov    cx,908-108+1
  1515.     mov    bx,Voices20
  1516. CountLoop:
  1517.     mov    dx,36h
  1518.     mov    ax,9DE4h
  1519.     div    bp
  1520.     mov    dx,0
  1521.     div    bx
  1522.     mov    Word Ptr cs:[FreqTable+si],ax
  1523.     inc    bp
  1524.     add    si,2
  1525.     loop    CountLoop
  1526.  
  1527. ;    Init the UltraSound
  1528.  
  1529.     mov    bx,CommandPort
  1530.     mov    cx,DataHighPort
  1531.     mov    dx,bx
  1532.     mov    al,Initialize
  1533.     out    dx,al
  1534.     mov    dx,cx
  1535.     mov    al,0
  1536.     out    dx,al
  1537.     mov    dx,BasePort
  1538.     Rept    6
  1539.     in    al,dx
  1540.     EndM
  1541.     mov    dx,bx
  1542.     mov    al,4Ch
  1543.     out    dx,al
  1544.     mov    dx,cx
  1545.     mov    al,1
  1546.     out    dx,al
  1547.     mov    dx,BasePort
  1548.     Rept    6
  1549.     in    al,dx
  1550.     EndM
  1551.  
  1552.     mov    dx,bx
  1553.     mov    al,DMACtrl
  1554.     out    dx,al
  1555.     mov    dx,cx
  1556.     mov    al,0
  1557.     out    dx,al
  1558.     mov    dx,bx
  1559.     mov    al,45h
  1560.     out    dx,al
  1561.     mov    dx,cx
  1562.     mov    al,0
  1563.     out    dx,al
  1564.     mov    dx,bx
  1565.     mov    al,49h
  1566.     out    dx,al
  1567.     mov    dx,cx
  1568.     mov    al,0
  1569.     out    dx,al
  1570.  
  1571.     mov    dx,bx
  1572.     mov    al,VoicesActive
  1573.     out    dx,al
  1574.     mov    dx,cx
  1575.     mov    al,NumVoices
  1576.     dec    al
  1577.     or    al,0C0h
  1578.     out    dx,al
  1579.  
  1580.     mov    dx,StatusPort
  1581.     in    al,dx
  1582.     mov    dx,bx
  1583.     mov    al,DMACtrl
  1584.     out    dx,al
  1585.     mov    dx,cx
  1586.     in    al,dx
  1587.     mov    dx,bx
  1588.     mov    al,49h
  1589.     out    dx,al
  1590.     mov    dx,cx
  1591.     in    al,dx
  1592.     mov    dx,bx
  1593.     mov    al,8Fh
  1594.     out    dx,al
  1595.     mov    dx,cx
  1596.     in    al,dx
  1597.  
  1598.     push    cx
  1599.     mov    cx,32
  1600. VoiceClearLoop:
  1601.     mov    dx,ActiveVoicePort
  1602.     mov    al,cl
  1603.     dec    al
  1604.     out    dx,al
  1605.     inc    dx
  1606.     mov    al,0
  1607.     out    dx,al
  1608.     add    dx,2
  1609.     mov    al,3    ; Voice Off
  1610.     out    dx,al
  1611.     sub    dx,2
  1612.     mov    al,0Dh
  1613.     out    dx,al
  1614.     add    dx,2
  1615.     mov    al,3    ; Ramp Off
  1616.     out    dx,al
  1617.     loop    VoiceClearLoop
  1618.     pop    cx
  1619.  
  1620.     mov    dx,bx
  1621.     mov    al,DMACtrl
  1622.     out    dx,al
  1623.     mov    dx,cx
  1624.     in    al,dx
  1625.     mov    dx,bx
  1626.     mov    al,49h
  1627.     out    dx,al
  1628.     mov    dx,cx
  1629.     in    al,dx
  1630.     mov    dx,bx
  1631.     mov    al,8Fh
  1632.     out    dx,al
  1633.     mov    dx,cx
  1634.     in    al,dx
  1635.  
  1636.     mov    dx,bx
  1637.     mov    al,Initialize
  1638.     out    dx,al
  1639.     mov    dx,cx
  1640.     mov    al,7
  1641.     out    dx,al
  1642.  
  1643.     mov    cx,NumVoices
  1644. SetRampRateLoop:
  1645.     mov    dx,ActiveVoicePort
  1646.     mov    al,NumVoices
  1647.     sub    al,cl
  1648.     out    dx,al
  1649.  
  1650.     mov    dx,CommandPort
  1651.     mov    al,VolRampRate
  1652.     out    dx,al
  1653.     mov    al,00111111b
  1654.     mov    dx,DataHighPort
  1655.     out    dx,al
  1656.  
  1657.     mov    dx,CommandPort
  1658.     mov    al,SetVolume
  1659.     out    dx,al
  1660.     mov    ax,cs:[GusVol]
  1661.     mov    dx,DataLowPort
  1662.     out    dx,ax
  1663.     loop    SetRampRateLoop
  1664.  
  1665. ;    Finished Initialize (Pheewww!!!!!!!!!!!!!)
  1666.  
  1667.     pop    es
  1668.     pop    ds
  1669.     popa
  1670.     ret
  1671.  
  1672. InitDevice    EndP
  1673.  
  1674. ClearMem    Proc    Far
  1675.  
  1676.     pusha
  1677.     push    es
  1678.     mov    es,cs:[PatternMem]
  1679.     call    DeAlloc
  1680.     pop    es
  1681.     popa
  1682.     ret
  1683.  
  1684. ClearMem    EndP
  1685.  
  1686. LoadMod        Proc    Far
  1687.  
  1688.     call    FileOpen
  1689.     jc    NoMod
  1690.     call    ModLoad
  1691.     call    FileClose
  1692. NoMod:
  1693.     ret
  1694.  
  1695. LoadMod        EndP
  1696.  
  1697. ModLoad        Proc    Near
  1698.  
  1699.     pusha
  1700.     push    ds
  1701.     push    es
  1702.  
  1703.     mov    cx,1084
  1704.     mov    dx,offset cs:[Info]
  1705.     push    cs
  1706.     pop    ds
  1707.     call    FileRead
  1708.     mov    cs:[NumChans],4
  1709.     mov    bp,offset cs:[Info+1080]
  1710.     mov    bx,0
  1711.     mov    cx,4
  1712. TestInst1:
  1713.     mov    al,cs:[bp]
  1714.     cmp    al,cs:[MKSign+bx]
  1715.     jne    NoMK1
  1716.     inc    bp
  1717.     inc    bx
  1718.     loop    TestInst1
  1719.     mov    si,offset cs:[Info+952]
  1720.     mov    cs:[MKMod],1
  1721.     jmp    Load
  1722. NoMK1:
  1723.     mov    bp,offset cs:[Info+1080]
  1724.     mov    bx,4
  1725.     mov    cx,4
  1726. TestInst2:
  1727.     mov    al,cs:[bp]
  1728.     cmp    al,cs:[MKSign+bx]
  1729.     jne    NoMK2
  1730.     inc    bp
  1731.     inc    bx
  1732.     loop    TestInst2
  1733.     mov    si,offset cs:[Info+952]
  1734.     mov    cs:[MKMod],1
  1735.     jmp    Load
  1736. NoMK2:
  1737.     mov    bp,offset cs:[Info+1080]
  1738.     mov    bx,8
  1739.     mov    cx,4
  1740. TestInst3:
  1741.     mov    al,cs:[bp]
  1742.     cmp    al,cs:[MKSign+bx]
  1743.     jne    No6CHN2
  1744.     inc    bp
  1745.     inc    bx
  1746.     loop    TestInst3
  1747.     mov    cs:[NumChans],6
  1748.     mov    si,offset cs:[Info+952]
  1749.     mov    cs:[MKMod],1
  1750.     jmp    Load
  1751. No6CHN2:
  1752.     mov    bp,offset cs:[Info+1080]
  1753.     mov    bx,12
  1754.     mov    cx,4
  1755. TestInst4:
  1756.     mov    al,cs:[bp]
  1757.     cmp    al,cs:[MKSign+bx]
  1758.     jne    No8CHN3
  1759.     inc    bp
  1760.     inc    bx
  1761.     loop    TestInst4
  1762.     mov    cs:[NumChans],8
  1763.     mov    si,offset cs:[Info+952]
  1764.     mov    cs:[MKMod],1
  1765.     jmp    Load
  1766. No8CHN3:
  1767.     mov    bp,offset cs:[Info+1080]
  1768.     mov    bx,16
  1769.     mov    cx,4
  1770. TestInst5:
  1771.     mov    al,cs:[bp]
  1772.     cmp    al,cs:[MKSign+bx]
  1773.     jne    STMod
  1774.     inc    bp
  1775.     inc    bx
  1776.     loop    TestInst5
  1777.     mov    cs:[NumChans],8
  1778.     mov    si,offset cs:[Info+952]
  1779.     mov    cs:[MKMod],1
  1780.     jmp    Load
  1781. STMod:
  1782.     call    MovePoint
  1783.     mov    dx,offset cs:[Info]
  1784.     mov    cx,600
  1785.     call    FileRead
  1786.     mov    si,offset cs:[Info+472]
  1787.     mov    cs:[MKMod],0
  1788.  
  1789. Load:
  1790.     mov    ax,cs:[si-2]
  1791.     mov    Word Ptr cs:[OrderLen],ax
  1792.     mov    di,offset cs:[PatternOrder]
  1793.     mov    cx,128
  1794. CopyOrder:
  1795.     mov    al,cs:[si]
  1796.     mov    cs:[di],al
  1797.     inc    si
  1798.     inc    di
  1799.     loop    CopyOrder
  1800.     mov    si,offset cs:[PatternOrder]
  1801.     mov    cx,128
  1802.     mov    ax,0
  1803. CheckPatt:
  1804.     mov    al,cs:[si]
  1805.     cmp    al,ah
  1806.     jb    NoHigh
  1807.     xchg    ah,al
  1808. NoHigh:
  1809.     inc    si
  1810.     loop    CheckPatt
  1811.     inc    ah
  1812.     xor    al,al
  1813.     mov    bx,cs:[NumChans]
  1814.     mul    bx
  1815.     mov    si,dx
  1816.     mov    di,ax
  1817.     mov    bx,16
  1818.     div    bx
  1819.     mov    bx,ax
  1820.     call    Alloc
  1821.     jnc    NoOutHunk
  1822.     jmp    Loaded            ; Fixa nån slags error-flagga.
  1823. NoOutHunk:
  1824.     mov    cs:[PatternMem],ax
  1825.     mov    ds,ax
  1826.  
  1827. LoadLoop:
  1828.     dec    si
  1829.     js    EndBigLoad
  1830.     mov    dx,0
  1831.     mov    cx,65535
  1832.     call    FileRead
  1833.     mov    dx,65535
  1834.     mov    cx,1
  1835.     call    FileRead
  1836.     mov    dx,ds
  1837.     add    dx,1000h
  1838.     mov    ds,dx
  1839.     jmp    Short LoadLoop
  1840. EndBigLoad:
  1841.     mov    cx,di
  1842.     mov    dx,0
  1843.     call    FileRead
  1844.  
  1845.     mov    cx,15
  1846.     cmp    cs:[MKMod],1
  1847.     jne    NoMK
  1848.     mov    cx,31
  1849. NoMK:
  1850.     mov    bx,4096
  1851.     call    Alloc
  1852.     mov    cs:[SampMem],ax
  1853.     mov    Word Ptr cs:[GUSMem],0
  1854.     mov    Word Ptr cs:[GUSMem+2],0
  1855.     mov    si,offset cs:[Info+42]
  1856.     mov    bp,0
  1857. LoadIns:
  1858.     push    cx
  1859.     mov    Word Ptr cs:[SampLen+bp],0
  1860.     mov    cx,cs:[si]
  1861.     add    si,2
  1862.     xchg    ch,cl
  1863.     cmp    cx,2
  1864.     jbe    NoIns
  1865.     shl    cx,1
  1866.     mov    cs:[SampLen+bp],cx
  1867.     mov    ds,cs:[SampMem]
  1868.     mov    dx,0
  1869.     call    FileRead
  1870.  
  1871. ;    Lets move the sample to the UltaraSound!
  1872.  
  1873.     push    bp
  1874.     mov    cx,cs:[SampLen+bp]
  1875.     shl    bp,1
  1876.     mov    di,Word Ptr cs:[GUSMem]
  1877.     mov    bl,Byte Ptr cs:[GUSMem+2]
  1878.     mov    Word Ptr [SampOffset+bp],di
  1879.     mov    Byte Ptr [SampOffset+bp+2],bl
  1880.     mov    bp,di
  1881.     mov    di,0
  1882. MSamp2GUS:
  1883.     mov    dx,CommandPort
  1884.     mov    al,DRAMAddrLo
  1885.     out    dx,al
  1886.     mov    dx,DataLowPort
  1887.     mov    ax,bp
  1888.     out    dx,ax
  1889.     mov    dx,CommandPort
  1890.     mov    al,DRAMAddrHi
  1891.     out    dx,al
  1892.     mov    dx,DataHighPort
  1893.     mov    al,bl
  1894.     out    dx,al
  1895.     mov    dx,DRAMIOPort
  1896.     mov    al,[di]
  1897.     out    dx,al
  1898.     inc    di
  1899.     add    bp,1
  1900.     adc    bl,0
  1901.     loop    MSamp2GUS
  1902.     mov     Word Ptr cs:[GUSMem],bp
  1903.     mov    Byte Ptr cs:[GUSMem+2],bl
  1904.     pop    bp
  1905.  
  1906. NoIns:
  1907.     mov    ah,0
  1908.     mov    al,cs:[si]
  1909.     inc    si
  1910.     mov    cs:[SampFine+bp],ax
  1911.     mov    al,cs:[si]
  1912.     inc    si
  1913.     mov    Byte Ptr cs:[SampVol+bp],al
  1914.  
  1915.     mov    dx,cs:[SampLen+bp]
  1916.     mov    ax,cs:[si]
  1917.     add    si,2
  1918.     xchg    ah,al
  1919.     mov    cx,cs:[si]
  1920.     add    si,2
  1921.     xchg    ch,cl
  1922.     cmp    cs:[MKMod],1
  1923.     jne    STMod1
  1924.     shl    ax,1
  1925.     shl    cx,1
  1926. STMod1:
  1927.     mov    cs:[SampRepLen+bp],cx
  1928.     add    cx,ax
  1929.     cmp    cx,dx
  1930.     jbe    NoRepFix
  1931.     mov    cx,dx
  1932.     sub    cx,ax
  1933.     mov    cs:[SampRepLen+bp],cx
  1934. NoRepFix:
  1935.     mov    cs:[SampRep+bp],ax
  1936.  
  1937.     add    si,22
  1938.     add    bp,2
  1939.     pop    cx
  1940.     dec    cx
  1941.     jz    Loaded
  1942.     jmp    LoadIns
  1943. Loaded:
  1944.     mov    es,cs:[SampMem]
  1945.     call    DeAlloc
  1946.  
  1947. ;    Set Pan Regs!!
  1948.  
  1949.     mov    cx,cs:[NumChans]
  1950.     mov    bx,cx
  1951.     shr    bx,1
  1952.     sub    bx,2
  1953.     shl    bx,4
  1954. SetPanLoop:
  1955.     mov    dx,ActiveVoicePort
  1956.     mov    al,Byte Ptr cs:[NumChans]
  1957.     sub    al,cl
  1958.     out    dx,al
  1959.  
  1960.     mov    dx,CommandPort
  1961.     mov    al,VoiceBalance
  1962.     out    dx,al
  1963.     mov    dx,DataHighPort
  1964.     mov    al,cs:[PanRegs+bx]
  1965.     out    dx,al
  1966.     inc    bx
  1967.     loop    SetPanLoop
  1968.  
  1969.     pop    es
  1970.     pop    ds
  1971.     popa
  1972.     ret
  1973.  
  1974. ModLoad        EndP
  1975.  
  1976. Alloc        Proc    Near
  1977.  
  1978.     push    bx
  1979.     mov    ax,4800h
  1980.     int    21h
  1981.     pop    bx
  1982.     ret
  1983.  
  1984. Alloc        EndP
  1985.  
  1986. DeAlloc        Proc    Near
  1987.  
  1988.     push    ax
  1989.     push    es
  1990.     mov    ax,4900h
  1991.     int    21h
  1992.     pop    es
  1993.     pop    ax
  1994.     ret
  1995.  
  1996. DeAlloc        EndP
  1997.  
  1998. FileRead    Proc    Near
  1999.  
  2000.     push    ax
  2001.     push    bx
  2002.     push    cx
  2003.     push    dx
  2004.     push    ds
  2005.     mov    ax,3F00h
  2006.     mov    bx,cs:[FileHandle]
  2007.     int    21h
  2008.     pop    ds
  2009.     pop    dx
  2010.     pop    cx
  2011.     pop    bx
  2012.     pop    ax
  2013.     ret
  2014.  
  2015. FileRead    EndP
  2016.  
  2017. FileOpen    Proc    Near
  2018.  
  2019.     push    dx
  2020.     push    ds
  2021.     mov    ax,3D00h
  2022.     int    21h
  2023.     mov    cs:[FileHandle],ax
  2024.     pop    ds
  2025.     pop    dx
  2026.     ret
  2027.  
  2028. FileOpen    EndP
  2029.  
  2030. FileClose    Proc    Near
  2031.  
  2032.     push    ax
  2033.     push    bx
  2034.     mov    ax,3E00h
  2035.     mov    bx,cs:[FileHandle]
  2036.     int    21h
  2037.     pop    bx
  2038.     pop    ax
  2039.     ret
  2040.  
  2041. FileClose    EndP
  2042.  
  2043. MovePoint    Proc    Near
  2044.  
  2045.     push    ax
  2046.     push    bx
  2047.     push    cx
  2048.     push    dx
  2049.     mov    ax,4200h
  2050.     mov    bx,cs:[FileHandle]
  2051.     mov    cx,0
  2052.     mov    dx,0
  2053.     int    21h
  2054.     pop    dx
  2055.     pop    cx
  2056.     pop    bx
  2057.     pop    ax
  2058.     ret
  2059.  
  2060. MovePoint    EndP
  2061.  
  2062. _Code    EndS
  2063.  
  2064.     End